/**
 * Axios HTTP 客户端配置
 * 提供统一的请求/响应拦截器和错误处理
 */
import axios, {AxiosError, AxiosResponse, InternalAxiosRequestConfig} from 'axios';

// API基础配置
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://172.22.49.244:17055/api/v1';
const API_TIMEOUT = 30000; // 30秒超时

/**
 * Axios 实例配置
 */
export const apiClient = axios.create({
    baseURL: API_BASE_URL,
    timeout: API_TIMEOUT,
    headers: {
        'Content-Type': 'application/json',
    },
});

/**
 * 请求拦截器
 * 用于添加认证信息、日志记录等
 */
apiClient.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // TODO: 后续添加用户认证 token
        // const token = getUserToken();
        // if (token) {
        //   config.headers.Authorization = `Bearer ${token}`;
        // }

        // 开发环境日志
        if (import.meta.env.DEV) {
            console.log('[API Request]', config.method?.toUpperCase(), config.url);
        }

        return config;
    },
    (error: AxiosError) => {
        console.error('[API Request Error]', error);
        return Promise.reject(error);
    }
);

/**
 * 响应拦截器
 * 统一处理 API 响应格式和错误
 */
apiClient.interceptors.response.use(
    (response: AxiosResponse) => {
        // 开发环境日志
        if (import.meta.env.DEV) {
            console.log('[API Response]', response.config.url, response.data);
        }

        // 直接返回 data 字段（根据你的 API 格式）
        return response;
    },
    (error: AxiosError<ApiErrorResponse>) => {
        // 统一错误处理
        const errorMessage = extractErrorMessage(error);

        console.error('[API Error]', {
            url: error.config?.url,
            status: error.response?.status,
            message: errorMessage,
        });

        // 返回格式化的错误对象
        return Promise.reject({
            message: errorMessage,
            status: error.response?.status,
            code: error.response?.data?.error?.code,
            fields: error.response?.data?.error?.fields,
        });
    }
);

/**
 * 从错误对象中提取可读的错误信息
 */
function extractErrorMessage(error: AxiosError<ApiErrorResponse>): string {
    // 优先使用后端返回的错误信息
    if (error.response?.data?.error?.message) {
        return error.response.data.error.message;
    }

    // 根据 HTTP 状态码返回默认错误信息
    switch (error.response?.status) {
        case 400:
            return '请求参数错误';
        case 404:
            return '请求的资源不存在';
        case 409:
            return '数据冲突（重复创建）';
        case 500:
            return '服务器内部错误';
        default:
            return error.message || '网络请求失败';
    }
}

/**
 * API 响应类型定义（基于你的 API.md）
 */
export interface ApiResponse<T> {
    success: boolean;
    data: T | null;
    error: ApiError | null;
    request_id: string;
}

export interface ApiError {
    code: string;
    message: string;
    hint?: string;
    fields?: ApiFieldError[];
}

export interface ApiFieldError {
    field: string;
    message: string;
}

interface ApiErrorResponse {
    error?: ApiError;
}
